/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkgMetodoPyramid.pkgNegocio;

import java.io.IOException;
import java.io.RandomAccessFile;
import pkgMetodoPyramid.pkgSoporte.Constants;
import pkgUtil.PASConstants;
import pkgUtil.pkgSupportFile.pkgFrameworkFile.IGrabable;
import pkgUtil.pkgSupportFile.pkgFrameworkFile.Register;

/**
 *
 * @author Administrador
 */
public class EntityPyramid implements IGrabable {

    private String edad;
    private int limInf;
    private int limSup;
    private boolean grupoAbierto;
    private Integer varones;
    private Integer mujeres;
    private Double porc_varones;
    private Double porc_mujers;
    private Double porc_vtotal;
    private Double porc_mtotal;

    public EntityPyramid() {
        grupoAbierto = false;
    }

    public EntityPyramid(String edad) {
        this.edad = edad;
        grupoAbierto = false;
        setIntervalos();
    }

    /**
     * @return the edad
     */
    public String getEdad() {
        return edad;
    }

    /**
     * @param edad the edad to set
     */
    public void setEdad(String edad) {
        this.edad = edad;
        setIntervalos();
    }

    private void setIntervalos() {
        if (edad.endsWith(Constants.SIMBOLOGRUPOABIERTO)) {
            String cadLimInf = edad.substring(0, edad.length() - 1);
            limInf = Integer.valueOf(cadLimInf);
            limSup = -1;
            grupoAbierto = true;
        } else {
            String[] limites = edad.split("-");
            limInf = Integer.valueOf(limites[0]);
            limSup = Integer.valueOf(limites[1]);
            grupoAbierto = false;
        }
    }

    public void transformarAGrupoAbierto() {
        String newEdad = limInf + Constants.SIMBOLOGRUPOABIERTO;
        setEdad(newEdad);
    }

    public void transformarAIntervalo() {
        int lSup = limInf + Constants.RANGOINTERVALO;
        String newEdad = limInf + Constants.SEPARADORINTERVALOS + lSup;
        setEdad(newEdad);
    }

    /**
     * @return the varones
     */
    public Integer getVarones() {
        return varones;
    }

    /**
     * @param varones the varones to set
     */
    public void setVarones(Integer varones) {
        this.varones = varones;
    }

    /**
     * @return the mujeres
     */
    public Integer getMujeres() {
        return mujeres;
    }

    /**
     * @param mujeres the mujeres to set
     */
    public void setMujeres(Integer mujeres) {
        this.mujeres = mujeres;
    }

    /**
     * @return the porc_varones
     */
    public Double getPorc_varones() {
        return porc_varones;
    }

    /**
     * @param porc_varones the porc_varones to set
     */
    public void setPorc_varones(Double porc_varones) {
        this.porc_varones = porc_varones;
    }

    /**
     * @return the porc_mujers
     */
    public Double getPorc_mujers() {
        return porc_mujers;
    }

    /**
     * @param porc_mujers the porc_mujers to set
     */
    public void setPorc_mujers(Double porc_mujers) {
        this.porc_mujers = porc_mujers;
    }

    /**
     * @return the porc_vtotal
     */
    public Double getPorc_vtotal() {
        return porc_vtotal;
    }

    /**
     * @param porc_vtotal the porc_vtotal to set
     */
    public void setPorc_vtotal(Double porc_vtotal) {
        this.porc_vtotal = porc_vtotal;
    }

    /**
     * @return the porc_mtotal
     */
    public Double getPorc_mtotal() {
        return porc_mtotal;
    }

    /**
     * @param porc_mtotal the porc_mtotal to set
     */
    public void setPorc_mtotal(Double porc_mtotal) {
        this.porc_mtotal = porc_mtotal;
    }

    @Override
    public boolean equals(Object o) {
        EntityPyramid p_entity = (EntityPyramid) o;
        return this.getEdad().equals(p_entity.getEdad());
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 61 * hash + (this.edad != null ? this.edad.hashCode() : 0);
        return hash;
    }

    public int getProxGrupoAbierto() {
        if (isGrupoAbierto()) {
            return limInf;
        }
        int gAbierto = limSup + 1;
        return gAbierto;
    }

    public String formatProxGrupoAbierto() {
        if (isGrupoAbierto()) {
            return String.valueOf(limInf) + Constants.SIMBOLOGRUPOABIERTO;
        }
        int gAbierto = limSup + 1;
        return String.valueOf(gAbierto) + Constants.SIMBOLOGRUPOABIERTO;
    }

    public int getGrupoAbierto() {
        return limInf;
    }

    public String formatGrupoAbierto() {
        return String.valueOf(limInf) + Constants.SIMBOLOGRUPOABIERTO;
    }

    public String formatProxGrupo() {

        int nextLInf = limInf + Constants.RANGOLIMINFERIOR;
        int nextLSup = nextLInf + Constants.RANGOINTERVALO;

        return nextLInf + Constants.SEPARADORINTERVALOS + nextLSup;
    }

    @Override
    public int compareTo(Object o) {
        EntityPyramid p_entity = (EntityPyramid) o;
        if (this.limInf > p_entity.limInf) {
            return 1;
        }
        if (this.limInf < p_entity.limInf) {
            return -1;
        }
        return 0;
    }

    /**
     * @return the esGrupoAbierto
     */
    public boolean isGrupoAbierto() {
        return grupoAbierto;
    }

    @Override
    public int sizeOf() {
        //El tamanio de 'edad' es 20 porque se se considera una cadena con una 
        //longitud másxima de 10 caracteretes (Cada caracter ocupa 2 byte)
        //tam(edad)+
        //tam(limInf)+tam(limSup)+tam(grupoAbierto)+
        //tam(varones)+tam(mujeres)+tam(porc_varones)+tam(porc_mujers)+
        //tam(porc_vtotal)+tam(porc_mtotal)+tam()+tam()

        int totalSize=(Constants.LENGTH_EDAD_FILE*PASConstants.sizeBytesStringCharacter)+
                  PASConstants.sizeBytesInteger+
                  PASConstants.sizeBytesInteger+
                  PASConstants.sizeBytesBoolean+
                  PASConstants.sizeBytesInteger+
                  PASConstants.sizeBytesInteger+
                  PASConstants.sizeBytesDouble+
                  PASConstants.sizeBytesDouble+
                  PASConstants.sizeBytesDouble+
                  PASConstants.sizeBytesDouble;
        return totalSize;
    }

    @Override
    public void save(RandomAccessFile a) throws IOException {
        Register.writeString(a, edad, Constants.LENGTH_EDAD_FILE);
        a.writeInt(limInf);
        a.writeInt(limSup);
        a.writeBoolean(grupoAbierto);
        a.writeInt(varones);
        a.writeInt(mujeres);
        a.writeDouble(porc_varones);
        a.writeDouble(porc_mujers);
        a.writeDouble(porc_vtotal);
        a.writeDouble(porc_mtotal);
    }

    @Override
    public void read(RandomAccessFile a) throws IOException {
        edad = Register.readString(a, 10).trim();
        limInf = a.readInt();
        limSup = a.readInt();
        grupoAbierto = a.readBoolean();
        varones = a.readInt();
        mujeres = a.readInt();
        porc_varones = a.readDouble();
        porc_mujers = a.readDouble();
        porc_vtotal = a.readDouble();
        porc_mtotal = a.readDouble();
    }
}
